#!/bin/bash

# =================================================
# 智能排产系统启动脚本
# 服务器端执行脚本
# =================================================

# 配置变量
APP_NAME="production-scheduling"
APP_VERSION="1.0.0"
JAR_NAME="${APP_NAME}.jar"
APP_DIR="/app/${APP_NAME}"
LOGS_DIR="${APP_DIR}/logs"
PID_FILE="${APP_DIR}/${APP_NAME}.pid"
JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGS_DIR}/"

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') $1"
}

# 检查目录
create_dirs() {
    log_info "创建必要目录..."
    mkdir -p ${APP_DIR}
    mkdir -p ${LOGS_DIR}
    mkdir -p ${APP_DIR}/uploads
    log_info "目录创建完成"
}

# 检查Java环境
check_java() {
    if ! command -v java &> /dev/null; then
        log_error "Java未安装，请先安装Java 17+"
        exit 1
    fi

    JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2 | cut -d'.' -f1)
    if [ "$JAVA_VERSION" -lt 17 ]; then
        log_error "Java版本过低，需要Java 17+，当前版本: $JAVA_VERSION"
        exit 1
    fi

    log_info "Java环境检查通过，版本: $(java -version 2>&1 | head -n 1)"
}

# 检查进程状态
check_process() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat $PID_FILE)
        if ps -p $PID > /dev/null 2>&1; then
            return 0  # 进程存在
        else
            rm -f $PID_FILE
            return 1  # 进程不存在
        fi
    else
        return 1  # PID文件不存在
    fi
}

# 停止应用
stop_app() {
    log_info "停止应用..."
    if check_process; then
        PID=$(cat $PID_FILE)
        log_info "发现运行中的进程 PID: $PID，正在停止..."

        kill $PID
        sleep 3

        # 检查是否已停止
        if ps -p $PID > /dev/null 2>&1; then
            log_warn "进程未正常停止，强制结束..."
            kill -9 $PID
            sleep 2
        fi

        rm -f $PID_FILE
        log_info "应用已停止"
    else
        log_info "应用未运行"
    fi
}

# 启动应用
start_app() {
    log_info "启动应用..."

    if check_process; then
        log_warn "应用已在运行中，PID: $(cat $PID_FILE)"
        return 1
    fi

    if [ ! -f "${APP_DIR}/${JAR_NAME}" ]; then
        log_error "JAR文件不存在: ${APP_DIR}/${JAR_NAME}"
        exit 1
    fi

    log_info "使用配置: production"
    log_info "JVM参数: $JVM_OPTS"
    log_info "日志目录: $LOGS_DIR"

    cd $APP_DIR
    nohup java $JVM_OPTS \
        -Dspring.profiles.active=prod \
        -Dlogging.file.path=$LOGS_DIR \
        -jar ${JAR_NAME} \
        > ${LOGS_DIR}/startup.log 2>&1 &

    echo $! > $PID_FILE

    log_info "应用启动中，PID: $(cat $PID_FILE)"
    log_info "请等待启动完成..."

    # 等待启动
    sleep 10

    if check_process; then
        log_info "应用启动成功！"
        log_info "访问地址: http://117.72.45.141:8091"
        log_info "API文档: http://117.72.45.141:8091/swagger-ui.html"
        log_info "健康检查: http://117.72.45.141:8091/actuator/health"
        log_info "日志文件: ${LOGS_DIR}/production-scheduling.log"
    else
        log_error "应用启动失败，请检查日志: ${LOGS_DIR}/startup.log"
        exit 1
    fi
}

# 重启应用
restart_app() {
    log_info "重启应用..."
    stop_app
    sleep 2
    start_app
}

# 查看状态
status_app() {
    if check_process; then
        PID=$(cat $PID_FILE)
        log_info "应用运行中，PID: $PID"

        # 显示进程信息
        ps aux | head -1
        ps aux | grep $PID | grep -v grep

        # 显示端口监听
        log_info "端口监听状态:"
        netstat -tulpn | grep :8091 || log_warn "8091端口未监听"
        netstat -tulpn | grep :8092 || log_warn "8092端口未监听"
    else
        log_info "应用未运行"
    fi
}

# 查看日志
logs_app() {
    if [ -f "${LOGS_DIR}/production-scheduling.log" ]; then
        log_info "最近50行日志:"
        tail -50 ${LOGS_DIR}/production-scheduling.log
    else
        log_warn "日志文件不存在"
    fi
}

# 清理日志
clean_logs() {
    log_info "清理日志文件..."
    rm -f ${LOGS_DIR}/*.log
    rm -f ${LOGS_DIR}/*.log.*
    log_info "日志清理完成"
}

# 主函数
main() {
    create_dirs
    check_java

    case "$1" in
        start)
            start_app
            ;;
        stop)
            stop_app
            ;;
        restart)
            restart_app
            ;;
        status)
            status_app
            ;;
        logs)
            logs_app
            ;;
        clean)
            clean_logs
            ;;
        *)
            echo "使用方法: $0 {start|stop|restart|status|logs|clean}"
            echo "  start   - 启动应用"
            echo "  stop    - 停止应用"
            echo "  restart - 重启应用"
            echo "  status  - 查看状态"
            echo "  logs    - 查看日志"
            echo "  clean   - 清理日志"
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"